[Update] วิธีการ Deploy Application โดยไม่ต้องหยุดการให้บริการใน Elastic Beanstalk
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
ครั้งนี้จะมาอัปเดตเกี่ยวกับวิธีการ Deploy Application โดยไม่ต้องหยุดการให้บริการใน Elastic Beanstalk
การตั้งค่า Rolling updates and deployments
แนะนำให้ศึกษาบทความลิงก์ด้านล่างนี้ก่อนเริ่มทำขั้นตอนในบทความนี้ เพราะมีการอธิบายเกี่ยวกับ Rolling Update คืออะไร และวิธีการ Deployment โดยสามารถใช้งานเว็บไซต์ได้อย่างต่อเนื่องครับ
เมื่อศึกษาบทความด้านบนนี้เสร็จแล้ว เริ่มทำการ Rolling Update ได้เลยครับ
สิ่งที่ต้องมี
※สร้าง Application ใน Elastic Beanstalk แล้ว
ตัวอย่างครั้งนี้จะสร้าง Application โดยใช้ชื่อดังนี้
Application:tinnakorn
ดูตัวอย่างได้ที่ลิงก์หัวข้อนี้: สร้าง Application ใน Elastic Beanstalk
สร้าง Environment สำหรับ Deploy Application
ตัวอย่างครั้งนี้จะสร้าง Environment โดยใช้ชื่อดังนี้
Environment:tinnakorn-rollingupdate
ดูตัวอย่างเพิ่มเติมได้ที่ลิงก์บทความและตัวอย่างตาม Step ด้านล่างนี้ (สำหรับผู้ใช้งานที่รู้วิธีการสร้าง Environment อยู่แล้วข้ามขั้นตอนนี้ไปได้เลย)
ครั้งนี้จะสร้าง Environment โดย Deploy Laravel ใน Elastic Beanstalk และเชื่อมต่อกับ RDS ดังนี้
Step 1: Configure environment
หัวข้อ Environment information
・Environment name:tinnakorn-rollingupdate
(ชื่ออะไรก็ได้)
・Domain:tinnakorn-rollingupdate
(ชื่ออะไรก็ได้)หัวข้อ Platform
・Platform:PHP
หัวข้อ Application code
・เลือกวิธีอัปโหลดไฟล์ตามต้องการ (ครั้งนี้จะใช้โปรเจกต์ Laravel)・คลิก
Next
Step 2: Configure service access
หัวข้อ Service access
・Service role:Use an existing service role
・Existing service roles:aws-elasticbeanstalk-service-role
・EC2 key pair:tinnakorn-rollingupdate
・EC2 instance profile:aws-elasticbeanstalk-ec2-role
・คลิกNext
Step 3 - optional: Set up networking, database, and tags
Step นี้ระบุว่า "optional" จึงไม่จำเป็นต้องตั้งค่าอะไร เพราะเป็นการทดสอบการใช้งาน ให้คลิก
Next
ได้เลย
**ตั้งแต่ขั้นตอนนี้ไปจะแตกต่างจากตัวอย่างในบทความข้างต้น**
Step 4 - optional: Configure instance traffic and scaling
Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้
หัวข้อ Instances
Root volume (boot device):
・Root volume type: General Purpose (SSD)
・Size: 10
GB (ขั้นต่ำคือ 10 GB)
แล้วค้นหาและเลือก EC2 security groups สำหรับ Elastic Beanstalk ที่สร้างในตอนแรก เช่น tinnakorn-rollingupdate
หัวข้อ Capacity
Auto scaling group
・Environment type: Load balanced
Instances: 2
Min, 2
Max (ครั้งนี้จะล็อกจำนวน Instance อยู่ที่ 2 ตัว)
Scaling triggers
Lower threshold: 0
capacity
หัวข้อ Load Balancer Type
เลือก Application load balancer
แล้วเลื่อนลงมาด้านล่างสุดและคลิก Next
Step 5 - optional: Configure updates, monitoring, and logging
ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: Step 5 - optional: Configure updates, monitoring, and logging
*เมื่อตั้งค่าตามลิงก์ด้านบนนี้เสร็จแล้ว ให้ตั้งค่าตามหัวข้อ การตั้งค่า Rolling updates and deployments ต่อเนื่องได้เลย เนื่องจากยังอยู่ใน "Step 5"
การตั้งค่า Rolling updates and deployments
ต่อไปหัวข้อ Rolling updates and deployments
Application deployments
・Deployment policy: Rolling
・Batch size type: Fixed
・Deployment batch size: 1
(instances at a time (max:2))
หัวข้อ Platform software Info
Container options
Proxy server: Nginx
Document root: /public
Step 6: Review
ตรวจสอบการตั้งค่าตั้งแต่ "Step 1 - Step 5" แล้วคลิก Submit
ด้านล่างสุด แล้วรอสักครู่
ระหว่างที่ระบบกำลังเริ่มต้นจะมีสถานะเป็น [Unknown
→ Pending
→ OK
] เมื่อระบบเริ่มต้นเสร็จแล้วจะแสดงหน้าจอแบบนี้ โดยมี Domain ที่เป็นลิงก์สำหรับแสดงผลหน้าเว็บไซต์ และมี Running version เป็นชื่อตามที่ป้อนตอนอัปโหลดไฟล์ ZIP
แล้วเข้าไปหน้าจอ Instance ค้นหาชื่อของเราโดยป้อนชื่อเดียวกับ Environment ก็จะแสดง Instance 2 ตัวตามที่เราตั้งค่าใน Elastic Beanstalk
ตรวจสอบเว็บไซต์
เมื่อสร้าง Environment เสร็จแล้ว คลิกลิงก์จากหน้า Environment เพื่อเปิดหน้าเว็บไซต์โปรเจกต์ของเราขึ้นมา
แล้วพิมพ์ /customer
ต่อท้าย (*หน้าเว็บไซต์นี้เป็นแค่ตัวอย่างการสาธิตในบทความนี้เท่านั้น)
http://tinnakorn-rollingupdate.ap-southeast-1.elasticbeanstalk.com/customer
แก้ไขข้อมูลในโปรเจกต์
ผมจะแก้ไขข้อความจาก name
ให้เป็น NAME
เพื่อทำการทดสอบการใช้งาน Rolling updates and deployments ในขั้นตอนถัดไป
เมื่อแก้ไขข้อความเสร็จแล้วให้สร้างไฟล์ ZIP เตรียมไว้ เช่น laravel10-sample_v2.zip
และ Deploy โดยการ Upload โปรเจกต์ที่แก้ไขนี้ไปยัง Environment ของเราอีกครั้งในขั้นตอนถัดไปครับ
Upload Application versions
*กรณีที่ไม่มี Version label ใน Application versions อยู่เลยจะไม่สามารถ Upload Version label ได้ แต่ถ้ามี Version label อยู่ก่อนแล้วจะสามารถ Upload Version label ได้ตามต้องการ
ผมจะ Deploy project version ใหม่ไปยัง Environment ที่สร้างในตอนแรกโดยใช้ไฟล์ laravel10-sample_v2.zip
และแสดงข้อมูลที่แก้ไขจากหน้า Web Browser
เข้ามาที่ Application versions
แล้วคลิก Upload
แล้วจะมี pop-up แสดงขึ้นมา ให้คลิก Choose file
เพื่อเลือกไฟล์ที่ต้องการ Upload แล้วป้อนชื่อ Version label ตามต้องการ และคลิก Upload
Deploy จาก Application versions ไปยัง Environment
เราจะ Deploy จาก Application versions ไปยัง Environment ที่กำลังทำงานอยู่
เราสามารถ Deploy เวอร์ชันที่ต้องการไปยัง Environment ที่กำลังทำงานอยู่ได้
ขั้นตอนนี้ผมจะ Deploy Version label ที่ชื่อ laravel10-sample_v2
ไปยัง Environment ของ tinnakorn-rollingupdate
เข้ามาที่ Application versions
แล้วติ๊ก ✅
Version label ที่ต้องการ เช่น laravel10-sample_v2
แล้วคลิก Action
และเลือก Deploy
แล้วจะมี pop-up แสดงขึ้นมา ให้เลือก Environment ที่ต้องการ เช่น tinnakorn-rollingupdate
แล้วคลิก Deploy
เมื่อ Deploy เสร็จแล้ว ให้ดูที่ "Deployed to" จะเห็นว่ามีชื่อ Environment ของ tinnakorn-rollingupdate
แสดงขึ้นมาแล้ว
*นอกจากนี้ยังสามารถใช้ในกรณีที่ต้องการกลับมาใช้เวอร์ชันเก่าได้อีกด้วย
กลับมาที่หน้าจอ Environment ของเรา แล้วดูที่ Running version จะเห็นว่าเปลี่ยนเป็น laravel10-sample_v2
แล้ว
ทดสอบ Refresh หน้าเว็บไซต์
เมื่อ Deploy version ใหม่เสร็จแล้ว กลับมาที่หน้าจอเว็บไซต์โปรเจกต์อีกครั้ง แล้ว Refresh ก็จะเห็นว่าข้อความแสดงเป็น NAME
ตามที่แก้ไขเรียบร้อยแล้ว
ตรวจสอบ Event
ขั้นตอนนี้ผมจะอธิบายเกี่ยวกับ Event ที่ได้มีการดำเนินการไปครับ
เข้ามาที่ Service Elastic Beanstalk แล้วเลือก Events
ใน Environment ของเรา แล้วดูที่ Event
เมื่อเสร็จสิ้นการดำเนินการ Deploy บน EC2 ครั้งที่ 1 ใน Batch 1 แล้ว ก็จะมาดำเนินการ Deploy บน EC2 ครั้งที่ 2 ใน Batch 2 เพราะ ELB ไม่ได้จัดสรรการเข้าถึง EC2 ในระหว่าง Deploy ซึ่งต่อให้อยู่ในระหว่าง Deploy บริการก็จะไม่หยุดนั่นเอง
และถ้าเห็นข้อความ 「Environment update completed successfully.」 แสดงขึ้นมาแล้ว ก็หมายความว่าการ Deploy version ใหม่เสร็จสมบูรณ์ครับ
สรุป
การสาธิตนี้ผมได้เน้นไปที่การตั้งค่า Rolling updates and deployments
เนื่องจากเห็นว่าฟังก์ชันนี้มีประโยชน์ในการช่วยให้เว็บไซต์ของเราสามารถใช้งานได้อย่างต่อเนื่อง ต่อให้ทำการ Deploy project version ใหม่เข้าไปยัง Environment ของเรา เว็บไซต์ก็ยังสามารถใช้งานต่อได้นั่นเองครับ
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !